package main

import "fmt"

//在函数中，程序员经常需要创建资源（比如：数据库连接、文件句柄、锁等），为了在函数执行完毕后，及时释放资源，Go的设计者提供defer（延时机制）
/*
func test(){
	//关闭文件资源
	file=openfile(文件名)
	defer file.close()
	//其它代码
}
//在defer后，可以继续使用创建资源
//当函数执行完毕后，系统会依次从defer栈中，取出语句，关闭资源
//这种机制，非常简洁，程序员不再为在什么时机关闭资源而烦心
*/
/*
注意事项
1当go执行到一个defer时，不会立即执行defer后的语句，而是将defer后的语句压入到一个栈中，然后继续执行函数下一个语句
2当函数执行完毕后，在从defer栈中，依次从栈顶取出语句执行
3在defer将语句放入栈时，也会将相关的值拷贝，同时入栈
*/

func sum(n1 int, n2 int) int {
	//当执行defer时，暂时不执行，会将defer后面的语句压入到独立的栈(defer栈)
	//当函数执行完毕后，再从defer栈，按照先进后出的方式出栈，执行
	defer fmt.Println("ok1 n1=", n1) //执行3,n1=10
	defer fmt.Println("ok2 n2=", n2) //执行2,n2=20
	//增加一句话
	n1++ //n1=11
	n2++ //n2=21
	res := n1 + n2
	fmt.Println("ok3 res=", res) //执行1
	return res
}
func main() {
	res := sum(10, 20)
	fmt.Println("res=", res) //执行4
}
